package com.pdk.server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.pdk.bean.OutObject;
import com.pdk.logic.Logic;
import com.pdk.logic.Process;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class MyThread extends Thread {

	Socket aSessionSoket = null;
	DataInputStream aDataInput = null;
	DataOutputStream aDataOutput = null;

	public MyThread(Socket socket) {
		aSessionSoket = socket;
	}

	public void run() {

		try {
			aDataInput = new DataInputStream(aSessionSoket.getInputStream());
			aDataOutput = new DataOutputStream(aSessionSoket.getOutputStream());
			SocketServer.userList.add(aDataOutput);
			while (true) {
				aDataOutput.writeUTF(dopost(aDataInput.readUTF()));
			}
		} catch (IOException e) {
			System.out.println("client close !" + e);
		} finally {
			try {
				aDataInput.close();
				if (aDataOutput != null) {
					aDataOutput.close();
					SocketServer.userList.remove(aDataOutput);
				}
				aSessionSoket.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}

	private String dopost(String msg) throws IOException {
		String result = "df" + msg;
		// JSONObject js = JSONObject.fromObject(msg);
		// if ("chat_all".equals(js.get("method"))) {
		// notifyAll("");
		// return "";
		// } else if ("chat_map".equals(js.get("method"))) {
		// int i = Integer.parseInt(js.get("id") + "");
		// notifyMap(i, "");
		// return "";
		// } else if ("hall".equals(js.get("method"))) {
		// return hall().toString();
		// } else if ("join".equals(js.get("method"))) {
		// int i = Integer.parseInt(js.get("id") + "");
		// // change hall
		// Map map = SocketServer.list.get(i);
		// List users = (List) map.get("user");
		// if (users == null) {
		// users = new ArrayList();
		// }
		// users.add("user01");
		// map.put("user", users);
		//
		// notifyAll("");
		//
		// // change root
		// List<DataOutputStream> dos = SocketServer.map.get(i);
		// if (dos == null) {
		// dos = new ArrayList<DataOutputStream>();
		// }
		// dos.add(aDataOutput);
		// SocketServer.map.put(i, dos);
		// notifyMap(i, "");
		// return "";
		// } else if ("begin".equals(js.get("method"))) {
		// int i = Integer.parseInt(js.get("id") + "");
		// List<DataOutputStream> dos = SocketServer.map.get(i);
		// if (dos.size() == 3) {
		// ArrayList[] list = Process.begin();
		// dos.get(0).writeUTF(list[0].toString());
		// dos.get(1).writeUTF(list[1].toString());
		// dos.get(2).writeUTF(list[2].toString());
		// }
		// return "";
		// } else if ("gt".equals(js.get("method"))) {
		// int i = Integer.parseInt(js.get("id") + "");
		// String new_value = js.get("new_value") + "";
		// String old_value = js.get("old_value") + "";
		// OutObject obj1 = new OutObject(new ArrayList());
		// OutObject obj2 = new OutObject(new ArrayList());
		// if (Logic.GT(obj1, obj2)) {
		// notifyMap(i, "");
		// }
		// return "";
		// }
		return result;
	}

	@SuppressWarnings("unchecked")
	private JSONArray hall() {
		JSONArray resultjs = new JSONArray();
		for (Map map : SocketServer.list) {
			resultjs.add(map);
		}
		return resultjs;
	}

	private void notifyMap(Integer id, String s) throws IOException {
		List<DataOutputStream> dos = SocketServer.map.get(id);
		if (dos != null) {
			for (DataOutputStream x : dos) {
				x.writeUTF(s);
			}
		}
	}

	private void notifyAll(String s) throws IOException {
		for (DataOutputStream x : SocketServer.userList) {
			x.writeUTF(s);
		}
	}

	// list_map(user ++)

}
